package com.ai.smlcore.util;


import java.io.InputStream;
import java.util.List;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ai.smlcore.util.Constants.SFTP_CONFIG;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class SFtpUtil {
	protected static transient Log logger = LogFactory.getLog(SFtpUtil.class);
	/**
	 * 连接sftp服务器
	 *
	 * @param host
	 *            主机
	 * @param port
	 *            端口
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @return
	 */
	public static ChannelSftp connect(String host, int port, String username, String password) {
		ChannelSftp sftp = null;
		try {
			JSch jsch = new JSch();
			Session sshSession = jsch.getSession(username, host, port);
			sshSession.setPassword(password);
			Properties sshConfig = new Properties();
			sshConfig.put("StrictHostKeyChecking", "no");
			sshSession.setConfig(sshConfig);
			sshSession.connect();
			Channel channel = sshSession.openChannel("sftp");
			channel.connect();
			sftp = (ChannelSftp) channel;
		} catch (Exception e) {
			logger.error("connect", e);
		}
		return sftp;
	}

	/**
	 * 上传文件
	 *
	 * @param directory
	 *            上传的目录
	 * @param uploadFile
	 *            要上传的文件
	 * @param sftp
	 */
	public static void upload(String fileName, InputStream inputStream, ChannelSftp sftp) {
		logger.info("upload : " +fileName);
		try {
			sftp.put(inputStream, fileName);
		} catch (Exception e) {
			logger.error("upload", e);
		}
	}

	/**
	 * 下载文件
	 *
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件
	 * @param saveFile
	 *            存在本地的路径
	 * @param sftp
	 */
	public static InputStream download(String downloadFile, ChannelSftp sftp) throws BusinessException {
		try {
			return sftp.get(downloadFile);
		} catch (SftpException e) {
			throw new BusinessException(e);
		}
	}

	/**
	 * 列出目录下的文件
	 *
	 * @param directory
	 *            要列出的目录
	 * @param sftp
	 * @return
	 * @throws SftpException
	 */
	public static List<?> listFiles(String directory, ChannelSftp sftp) throws SftpException {
		return sftp.ls(directory);
	}

	/**
	 * 删除文件
	 *
	 * @param filePath
	 *            文件地址
	 * @param sftp
	 */
	public static void deleteFile(String filePath, ChannelSftp sftp) throws BusinessException {
		try {
			sftp.rm(filePath);
		} catch (SftpException e) {
			throw new BusinessException(e);
		}
	}
	
	/**
	 * 删除目录
	 *
	 * @param dirPath
	 *            目录地址
	 * @param sftp
	 */
	public static void deleteDir(String dirPath, ChannelSftp sftp) throws BusinessException {
		try {
			sftp.rmdir(dirPath);
		} catch (SftpException e) {
			throw new BusinessException(e);
		}
	}
	
	public static ChannelSftp getSftp() {
		// ftp服务地址
		String hostIp = PropertiesUtil.getString(SFTP_CONFIG.SFTP_HOST_IP);
		// ftp端口
		int port = PropertiesUtil.getInt(SFTP_CONFIG.SFTP_HOST_PORT);
		// ftp用户账号
		String userName = PropertiesUtil.getString(SFTP_CONFIG.SFTP_HOST_USERNAME);
		// ftp用户密码
		String userPwd = PropertiesUtil.getString(SFTP_CONFIG.SFTP_HOST_USERPSWD);

		ChannelSftp sftp = SFtpUtil.connect(hostIp, port, userName, userPwd);

		return sftp;
	}
	
	public static void disconnect(ChannelSftp sftp) {
		try {
			sftp.disconnect();
			sftp.getSession().disconnect();
		} catch (JSchException e) {
			logger.error("disconnect", e);
		}
	}
}
